﻿using sipfe.model.dataAccess;
using System;
using System.Collections.Generic;
using System.Data.Entity.Validation;
using System.Linq;
using System.Text;
using System.Data;
using sipfe.util;
using sipfe.model.sqlExecutor;
/*
using sipfe.model.dataAccess;
using sipfe.util;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text; 
 */
namespace sipfe.model.nuevo
{
    public class SolicitudDAO
    {
        private BDSIPFEEntities db = new BDSIPFEEntities();

        public String[] AddNuevaSolicitudDAO(SIPMaeSolicitud sipMaeSolicitud, string vinculos, string tipoVinculos)
        {
            //db.ORIDetSolicitud.AddObject(eventonuevo);
            String error = "1";
            String rpta = "1";

            List<SIPDetVinculoPersona> listaVinculo = new List<SIPDetVinculoPersona>();

            try
            {               
               
                if (!string.IsNullOrEmpty(vinculos))
                {
                    string[] arrayVinculos = vinculos.Split(',');
                    string[] arrayTipoVinculos = tipoVinculos.Split(',');

                    for (int i = 0; i < arrayVinculos.Length; i++)
                    {
                        SIPDetVinculoPersona vp = new SIPDetVinculoPersona();
                        vp.nIdePersona      =   Convert.ToInt32(arrayVinculos[i]);
                        vp.nIdeTipoVinculo  =   Convert.ToInt32(arrayTipoVinculos[i]);
                        vp.dIniVig          =   DateTime.Now;
                        vp.dtFecReg         =   DateTime.Now;
                        vp.nIdeUsuReg       =   sipMaeSolicitud.nIdeUsuReg;
                        sipMaeSolicitud.SIPDetVinculoPersona.Add(vp);
                    }


                    /*
                    foreach (string vinculo in arrayVinculos)
                    {
                        SIPDetVinculoPersona vp = new SIPDetVinculoPersona();
                        vp.nIdePersona = Convert.ToInt32(vinculo);
                        vp.nIdeTipoVinculo  =   1;
                        vp.dIniVig          =   DateTime.Now;
                        vp.dtFecReg         =   DateTime.Now;
                        vp.nIdeUsuReg       =   sipMaeSolicitud.nIdeUsuReg;
                        sipMaeSolicitud.SIPDetVinculoPersona.Add(vp);
                    }*/
                }
                sipMaeSolicitud.nNumCorre       =   getCorrelativoSolicitud(sipMaeSolicitud);
                sipMaeSolicitud.nAnnSolicitud   =   UtilitariosUtil.yearNow();
                sipMaeSolicitud.dtFecSol        =   DateTime.Now;
                sipMaeSolicitud.dtFecRegistro   =   DateTime.Now;
                sipMaeSolicitud.nIdeTipoSolicitante = Constante.TIPO_PERSONA.NATURAL;

                /*******************inicio del ingreso del primer paso *******************************/
                SIPDetSolicitud sipDetSolicitud = new SIPDetSolicitud();                
                sipDetSolicitud.nSeqPaso    =   1;
                sipDetSolicitud.vSumilla    =   "SOLICITUD DE BECA";
                sipDetSolicitud.dtFecReg    =   DateTime.Now;
                sipDetSolicitud.nIdeUsuReg  =   sipMaeSolicitud.nIdeUsuReg;
                sipDetSolicitud.nFolios     =   0;
                sipDetSolicitud.nIdePara    =   1;
                
                /*******************fin del ingreso del primer paso ***********************************/
                /*******************inicio del ingreso del actor origen********************************/
                SIPDetSoliActor sipDetSoliActor = new SIPDetSoliActor();
                sipDetSoliActor.nSeqPaso            =   1;
                sipDetSoliActor.nSeqActor           =   1;
                sipDetSoliActor.nIdeTipoBandeja     =   1;
                sipDetSoliActor.nIdeTipoActor       =   1;
                sipDetSoliActor.nIdeTipoCategoria   =   1;
                sipDetSoliActor.nIdeDep             =   sipMaeSolicitud.nIdeDepSolicitud;
                sipDetSoliActor.nIdeFuncionario     =   sipMaeSolicitud.nIdeFuncionario;
                sipDetSoliActor.dtFecRecepcion      =   DateTime.Now;
                sipDetSoliActor.dtFecDerivacion     =   DateTime.Now;
                sipDetSoliActor.dtFecRecFisica      =   DateTime.Now;
                sipDetSoliActor.dtFecLectura        =   DateTime.Now;
                sipDetSoliActor.nIdUsuLectura       =   sipMaeSolicitud.nIdeUsuReg;
                sipDetSoliActor.nIdUsuRecepFis      =   sipMaeSolicitud.nIdeUsuReg;
                /*******************fin del ingreso del actor origen***********************************/
                sipDetSolicitud.SIPDetSoliActor.Add(sipDetSoliActor);
                /*******************inicio del ingreso del actor destino********************************/
                sipDetSoliActor = new SIPDetSoliActor();
                sipDetSoliActor.nSeqPaso            =   1;
                sipDetSoliActor.nSeqActor           =   2;
                sipDetSoliActor.nIdeTipoBandeja     =   1;
                sipDetSoliActor.nIdeTipoActor       =   2;
                sipDetSoliActor.nIdeTipoCategoria   =   2;
                sipDetSoliActor.nIdeFuncionario     =   sipMaeSolicitud.nIdeFuncionario;
                sipDetSoliActor.nIdeDep             =   7;                
                sipDetSoliActor.dtFecRecepcion      =   DateTime.Now;
                /*******************fin del ingreso del actor destino**********************************/
                sipDetSolicitud.SIPDetSoliActor.Add(sipDetSoliActor);
                sipMaeSolicitud.SIPDetSolicitud.Add(sipDetSolicitud);
                db.SIPMaeSolicitud.Add(sipMaeSolicitud);
                db.SaveChanges();

            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }
            //return new String[] { };
            return new String[] { sipMaeSolicitud.nIdeSol.ToString()};
        }


        public string[] AddNuevoCasoDAO(SIPMaeSolicitud sipMaeSolicitud, string n_IdeTipoDocumRef, string v_NumDocumRef)
        {
            try
            {
                sipMaeSolicitud.nNumCorre = getCorrelativoSolicitud(sipMaeSolicitud);
                sipMaeSolicitud.nAnnSolicitud = UtilitariosUtil.yearNow();

                String fecRecep = sipMaeSolicitud.dFecRecepFisica + " " + sipMaeSolicitud.horaStr + ":" + sipMaeSolicitud.minutoStr;
                DateTime fecha = UtilitariosUtil.formatearFechaHHmm(fecRecep);
                sipMaeSolicitud.dtFecSol = fecha;
                sipMaeSolicitud.dtFecRegistro = DateTime.Now;

                /**************verificamos el tipo del documento ruc o dni*************/
                decimal n_IdeTipoDocum = sipMaeSolicitud.nIdeTipoDocum;
                if (Constante.N_RUC == n_IdeTipoDocum)
                {
                    sipMaeSolicitud.nIdeEmpresa = sipMaeSolicitud.nIdeEmpresa;
                    sipMaeSolicitud.nIdeTipoSolicitante = Constante.TIPO_PERSONA.JURIDICA;
                }
                else
                {
                    sipMaeSolicitud.nIdePersonSolicita = sipMaeSolicitud.nIdeEmpresa;
                    sipMaeSolicitud.nIdeTipoSolicitante = Constante.TIPO_PERSONA.NATURAL;
                    sipMaeSolicitud.nIdeEmpresa = null;
                }


                /*******************inicio del ingreso del primer paso *******************************/
                SIPDetSolicitud sipDetSolicitud = new SIPDetSolicitud();
                sipDetSolicitud.nSeqPaso = 1;
                sipDetSolicitud.vSumilla = "";
                sipDetSolicitud.dtFecReg = DateTime.Now;
                sipDetSolicitud.nIdeUsuReg = sipMaeSolicitud.nIdeUsuReg;
                sipDetSolicitud.nFolios = 0;
                sipDetSolicitud.nIdePara = 1;

                /*******************fin del ingreso del primer paso ***********************************/

                /*******************inicio del ingreso de archivos adjuntos *******************************/
                //sipMaeSolicitud.SIPDetSolicitud.ElementAt(0).SIPDetArchivo.Add(sipDetArchivo);
                // sipMaeSolicitud.SIPDetArchivo1 = sipDetArchivo;

                if (sipMaeSolicitud.SIPDetArchivo1 != null)
                {
                    //SIPDetArchivo sipDetArchivo = new SIPDetArchivo();
                   // sipDetArchivo = sipMaeSolicitud.SIPDetSolicitud.ElementAt(0).SIPDetArchivo.ElementAt(0);
                  //  sipDetSolicitud.SIPDetArchivo.ElementAt(0).nIdeSol = n_IdeSol;
                  //  sipDetSolicitud.SIPDetArchivo.ElementAt(0).nSeqPaso = 1;
                    sipDetSolicitud.SIPDetArchivo.Add(sipMaeSolicitud.SIPDetArchivo1);
                }

                /*******************fin del ingreso de archivos adjuntos *******************************/


                /*******************inicio del registro de referencias *******************************/
                List<SIPDetReferencia> listaReferencias = new List<SIPDetReferencia>();

                if (!string.IsNullOrEmpty(n_IdeTipoDocumRef))
                {
                    string[] arrayTipo = n_IdeTipoDocumRef.Split(',');
                    string[] arrayNumero = v_NumDocumRef.Split(',');

                    for (int i = 0; i < arrayTipo.Length; i++)
                    {
                        SIPDetReferencia refe = new SIPDetReferencia();
                        refe.nIdeTipoDoc = Convert.ToInt32(arrayTipo[i]);
                        refe.vDescrRef = arrayNumero[i];
                        sipDetSolicitud.SIPDetReferencia.Add(refe);
                    }
                }

                /*******************fin del registro de referencias **********************************/
                /*******************inicio del ingreso del actor origen********************************/
                SIPDetSoliActor sipDetSoliActor = new SIPDetSoliActor();
                sipDetSoliActor.nSeqPaso = 1;
                sipDetSoliActor.nSeqActor = 1;
                sipDetSoliActor.nIdeTipoBandeja = 1;
                sipDetSoliActor.nIdeTipoActor = 1;
                sipDetSoliActor.nIdeTipoCategoria = 1;
                sipDetSoliActor.nIdeDep = sipMaeSolicitud.nIdeDepSolicitud;
                sipDetSoliActor.nIdeFuncionario = sipMaeSolicitud.nIdeFuncionario;
                sipDetSoliActor.dtFecRecepcion = DateTime.Now;
                sipDetSoliActor.dtFecDerivacion = DateTime.Now;
                sipDetSoliActor.dtFecRecFisica = DateTime.Now;
                sipDetSoliActor.dtFecLectura = DateTime.Now;
                sipDetSoliActor.nIdUsuLectura = sipMaeSolicitud.nIdeUsuReg;
                sipDetSoliActor.nIdUsuRecepFis = sipMaeSolicitud.nIdeUsuReg;
                /*******************fin del ingreso del actor origen***********************************/
                sipDetSolicitud.SIPDetSoliActor.Add(sipDetSoliActor);
                /*******************inicio del ingreso del actor destino********************************/

                string destinatarios = sipMaeSolicitud.vDestino;
                string[] arrayDestinos = destinatarios.Split(',');
                int seqActor = 1;
                foreach (string destino in arrayDestinos)
                {
                    seqActor++;
                    sipDetSoliActor = new SIPDetSoliActor();
                    sipDetSoliActor.nSeqPaso = 1;
                    sipDetSoliActor.nSeqActor = seqActor;
                    sipDetSoliActor.nIdeTipoBandeja = 1;
                    sipDetSoliActor.nIdeTipoActor = 2;
                    sipDetSoliActor.nIdeTipoCategoria = 2;
                    sipDetSoliActor.nIdeFuncionario = sipMaeSolicitud.nIdeFuncionario;
                    sipDetSoliActor.nIdeDep = Decimal.Parse(destino);
                    sipDetSoliActor.dtFecRecepcion = DateTime.Now;
                    sipDetSolicitud.SIPDetSoliActor.Add(sipDetSoliActor);
                }
                sipMaeSolicitud.SIPDetSolicitud.Add(sipDetSolicitud);
                db.SIPMaeSolicitud.Add(sipMaeSolicitud);
                db.SaveChanges();
                
                //SIPDetReferencia
            }
            catch (DbEntityValidationException dbEx)
            {
                var errorMessages = dbEx.EntityValidationErrors.SelectMany(x => x.ValidationErrors).Select(x => x.ErrorMessage);
                var fullErrorMessage = string.Join("; ", errorMessages);
                var exceptionMessage = string.Concat(dbEx.Message, " The validation errors are: ", fullErrorMessage);
                throw new DbEntityValidationException(exceptionMessage, dbEx.EntityValidationErrors);
            }            
            return new String[] { sipMaeSolicitud.nIdeSol.ToString() };
        }





        public SIPMaeSolicitud sipMaeSolicitudByIdDAO_old(decimal nIdeSol)
        {
            return db.SIPMaeSolicitud.Find(nIdeSol);
        }

        public List<SIPMaeSolicitud> sipMaeSolicitudListaDAO(decimal nIdeSol)
        {
            return db.SIPMaeSolicitud.Where(x => x.nIdeSol == nIdeSol).ToList();
        }


        private decimal getCorrelativoSolicitud(SIPMaeSolicitud sipMaeSolicitud)
        {          
            decimal annioNow    =   UtilitariosUtil.yearNow();
            decimal clase       =   sipMaeSolicitud.nIdeClaseSolicitud;
            decimal nideDep     =   sipMaeSolicitud.nIdeDepSolicitud;
            StringBuilder sql   =   new StringBuilder();
            
            sql.Append("select isnull(MAX(nNumCorre),0) + 1 from SIPMaeAreaNumera where nIdeDep=").Append(nideDep);
            sql.Append(" AND nAnoCorre=").Append(annioNow).Append(" AND nIdeClaseSol=").Append(clase);

            var max = db.Database.SqlQuery<Decimal>(sql.ToString());
            List<Decimal> valores = max.ToList<Decimal>();
            Decimal secuencia = valores.First<Decimal>();
            SIPMaeAreaNumera sipMaeAreaNumera = new SIPMaeAreaNumera();

            if (secuencia == 1)
            {
                sipMaeAreaNumera.nAnoCorre      =   annioNow;
                sipMaeAreaNumera.nIdeDep        =   nideDep;
                sipMaeAreaNumera.nIdeClaseSol   =   clase;
                sipMaeAreaNumera.nNumCorre      =   1;
                sipMaeAreaNumera.nIdeUsuReg     =   sipMaeSolicitud.nIdeUsuReg;
                sipMaeAreaNumera.dtFecReg       =   DateTime.Now;
                secuencia = 1;
                db.SIPMaeAreaNumera.Add(sipMaeAreaNumera);
            }
            else
            {
                sipMaeAreaNumera = db.SIPMaeAreaNumera.Where(s => s.nAnoCorre == annioNow && s.nIdeDep == nideDep && s.nIdeClaseSol==clase).FirstOrDefault();
                sipMaeAreaNumera.nNumCorre = secuencia;
                db.Entry(sipMaeAreaNumera).State = EntityState.Modified;
            }
            return secuencia;
        }


        private SIPDetSolicitud setPasoSolicitud(string v_Sumilla, decimal n_IdeSol, decimal n_IdeUsuReg, decimal n_Folios)
        {

            SIPDetSolicitud sipDetSolicitud = new SIPDetSolicitud();
            //buscamos la siguiente secuencia del paso
            StringBuilder sql = new StringBuilder();
            sql.Append("select isnull(MAX(nSeqpaso),0) + 1 from SIPDetSolicitud where nIdeSol=").Append(n_IdeSol);
            var max = db.Database.SqlQuery<Decimal>(sql.ToString());
            List<Decimal> valores = max.ToList<Decimal>();
            Decimal seqPaso = valores.First<Decimal>();
           // sipDetSolicitud.nIdeSol     =   n_IdeSol;
            sipDetSolicitud.nSeqPaso    =   seqPaso;
            sipDetSolicitud.vSumilla    =   v_Sumilla;
            sipDetSolicitud.dtFecReg    =   DateTime.Now;
            sipDetSolicitud.nIdeUsuReg  =   n_IdeUsuReg;
            sipDetSolicitud.nFolios     =   n_Folios;
            sipDetSolicitud.nIdePara = 1;
            return sipDetSolicitud;
        }

        private SIPMaeSolicitud setActorSolicitud(string v_Sumilla, decimal n_IdeSol, decimal n_IdeUsuReg, decimal n_Folios)
        {

            SIPMaeSolicitud sipMaeSolicitud = new SIPMaeSolicitud();
            //buscamos la siguiente secuencia del paso
            StringBuilder sql = new StringBuilder();
            sql.Append("select isnull(MAX(nSeqpaso),0) + 1 from SIPDetSolicitud where nIdeSol=").Append(n_IdeSol);
            var max = db.Database.SqlQuery<Decimal>(sql.ToString());
            List<Decimal> valores = max.ToList<Decimal>();
            Decimal seqPaso = valores.First<Decimal>();
            // sipDetSolicitud.nIdeSol     =   n_IdeSol;
           // sipDetSolicitud.nSeqPaso = seqPaso;
            // sipDetSolicitud.vSumilla = v_Sumilla;
            //  sipDetSolicitud.dtFecReg = DateTime.Now;
            //  sipDetSolicitud.nIdeUsuReg = n_IdeUsuReg;
            //  sipDetSolicitud.nFolios = n_Folios;
            //  sipDetSolicitud.nIdePara = 1;
            return sipMaeSolicitud;
        }

        public List<SIPMaeEmpresa> ListaEmpresaDAO(int n_IdeCodPaisDoc, int n_IdeTipoDocum, string v_Nombres)
        {
            var resultado = db.SIPMaeEmpresa.Where(s => s.vRazonSocial.Contains(v_Nombres)).ToList();
            return resultado;
        }

        public List<SIPMaePersona> ListaPersonaDAO(int n_IdeCodPaisDoc, int n_IdeTipoDocum, string v_Nombres)
        {
            var resultado = db.SIPMaePersona.Where(s => (s.vPriNombre + " " + s.vPriApellido + " " + s.vSegApellido).Contains(v_Nombres)).ToList();
            return resultado;
        }

        public IList<dynamic> VerificaConvocatoriaExisteDAO(int nideEmpresa, int nideNivel, int nideConcepto, int nModalidad)
        {
            String[] parametros = new String[] { nideEmpresa.ToString(), nideNivel.ToString(), nideConcepto.ToString(), nModalidad.ToString() };
            String[] nombreParametros = new String[] { "nInstitucion", "nNivel", "nConcepto", "nModalidad" };
            IList<dynamic> lista = SqlExecutorSP.executeStore("paSIPCheckConvocatoria", parametros, nombreParametros);           
            return lista;
        }


    }
}
